package jp.seraph.jsade.task;

import jp.seraph.jsade.core.Player;
import jp.seraph.jsade.core.World;
import jp.seraph.jsade.util.Executor;

public interface AgentTask {
    /**
     * タスクに対し、実行が開始されることが通知される
     */
    public void init();

    /**
     * タスクを実行する
     * このメソッドは、実行中である間、毎ステップ呼び出されます。
     */
    public void execute(World aWorld, Player aPlayer);

    /**
     * このタスクをキャンセルする
     */
    public void cancel();

    public boolean canExecute();

    /**
     * このタスクが実行中であるかどうかを返す
     *
     * @return 実行中ならばtrue
     */
    public boolean isRunning();

    public void addCompletedListener(Executor aListener);
    public void removeCompletedListener(Executor aListener);
    public void addCanceledListener(Executor aListener);
    public void removeCanceledListener(Executor aListener);
    public void addInitiatedListener(Executor aListener);
    public void removeInitiatedListener(Executor aListener);
}
